package br.unisul.redeNeural;

/**
 * Classe responsavel por aplicar a função de ativação, sobre um limiar
 * @author Joelson Fernandes
 *
 */
public class DefaultFuncaoAtivacao implements FuncaoAtivacao, java.io.Serializable{


	/**
	 * 
	 */
	private static final long serialVersionUID = -880699975946433536L;

	/**
	 * Tipo de saida binaria (1 = verdadeiro, 0 = false)
	 */
	public static final int BINARIA = 0;

	/**
	 * Tipo de saida Bipolar (1 = verdadeiro, 0 = desconhecido,-1 = false)
	 */
	public static final int BIPOLAR = 1;

	private double limiar ;

	private int tipoSaida;

	/**
	 * Cria uma nova função de ativação com o seu limiar igual a 0
	 * e saida Bipolar
	 */
	public DefaultFuncaoAtivacao() {
		this(0.0);
	}

	/**
	 * Cria uma noval função de ativação como o seu limiar e
	 * tipo de saida Bipolar
	 * @param limiar - limiar da função
	 */
	public DefaultFuncaoAtivacao(double limiar) {
		this(limiar, BIPOLAR);
	}



	/**
	 * Cria uma nova função de ativação com o seu limiar igual a 0
	 * @param tipoSaida - tipo de saida que o metodo funcao ira retornar. (bipolar ou binaria)
	 */
	public DefaultFuncaoAtivacao(int tipoSaida) {
		this(0.0, tipoSaida);
	}

	/**
	 * Cria uma noval função de ativação com o limiar e o tipo de saida
	 * @param limiar - limiar da função
	 * @param tipoSaida - tipo de saida que o metodo funcao ira retornar. (bipolar ou binaria)
	 */
	public DefaultFuncaoAtivacao(double limiar, int tipoSaida) {
		super();
		this.limiar = limiar;
		this.tipoSaida = tipoSaida;
	}

	/**
	 * Metodo para acionar uma funcao de ativacao
	 * @param valor - valor para a função
	 * @return <ul>
	 * <li>Bipolar: <ul><li>1 se valor >= limiar;<li>-1 se valor < -limiar; 
	 * <li>0 se o valor estiver entre limiar e - limiar</ul>
	 * <li>Binaria: <ul><li>1 se valor >=limiar;<li>0 se valor < limiar </ul> 
	 * <li>Caso passe uma função desconhecida o metodo ira retornar <code>{@link Integer}.MIN_VALUE</code>
	 * </ul>
	 */
	public double funcao(double valor) {
		if(tipoSaida == BIPOLAR){
			if(valor>=limiar){
				return 1;
			}
			else if(valor>-limiar && valor<limiar){
				return 0;
			}
			else {
				return -1;
			}
		}else if(tipoSaida == BINARIA){
			if(valor>=limiar){
				return 1;
			}
			else {
				return 0;
			}
		}
		return Integer.MIN_VALUE;
	}

	/**
	 * @return the limiar
	 */
	public double getLimiar() {
		return limiar;
	}

	/**
	 * @param limiar the limiar to set
	 */
	public void setLimiar(double limiar) {
		this.limiar = limiar;
	}

}
